import themeChangeBehavior from 'tdesign-miniprogram/mixins/theme-change';
const { requireLogin, fetchUserInfo, logout } = require('../../utils/api.js');
const { requireAuth, autoCheckTokenStatus } = require('../../utils/auth-utils.js');
const { 
  ROLES, 
  MODULES, 
  hasPermission, 
  getUserType, 
  getRoleName,
  checkPermissionAndNavigate,
  getUserPermissions,
  logPermission 
} = require('../../utils/permission.js');
const { pageOptimizationMixin } = require('../../utils/page-optimization-mixin.js');

Page({
  behaviors: [themeChangeBehavior],
  
  // 混入页面优化
  ...pageOptimizationMixin,
  
  data: {
    ...pageOptimizationMixin.data,
    userInfo: null,
    moduleList: [],
    statistics: {
      todayPiecework: 168,
      pendingApproval: 12,
      monthSalary: 8650,
      inventoryAlert: 5
    },
    navbarHeight: 0,
    statusBarHeight: 0
  },

  onLoad() {
    // 使用优化的页面加载
    this.onLoadOptimized('workbench', () => {
      // 使用增强的认证检查
      if (!requireAuth(this, true)) {
        return;
      }
      
      this.getNavbarHeight();
      this.loadEssentialData();
    });
  },

  onReady() {
    // 使用优化的页面准备完成
    this.onReadyOptimized(() => {
      this.loadSecondaryData();
    });
  },

  getNavbarHeight() {
    // 获取系统信息
    const systemInfo = wx.getSystemInfoSync();
    const statusBarHeight = systemInfo.statusBarHeight;
    
    // 获取胶囊按钮位置信息
    const menuButton = wx.getMenuButtonBoundingClientRect();
    
    // 计算自定义导航栏的高度
    const navbarHeight = menuButton.top + menuButton.height + (menuButton.top - statusBarHeight);
    
    this.setData({ 
      navbarHeight: navbarHeight,
      statusBarHeight: statusBarHeight 
    });
  },

  onShow() {
    // 使用优化的页面显示
    this.onShowOptimized(() => {
      this.refreshData();
    });
    
    // 使用增强的token状态检查
    if (!autoCheckTokenStatus(true)) {
      return; // 如果token已过期，函数会自动处理跳转
    }
    
    // 检查用户信息是否需要更新
    const userInfo = wx.getStorageSync('userInfo');
    if (userInfo && userInfo.role && JSON.stringify(userInfo) !== JSON.stringify(this.data.userInfo)) {
      this.setData({ userInfo });
    }
  },

  onUnload() {
    // 使用优化的页面卸载
    this.onUnloadOptimized();
  },

  // 加载关键数据
  async loadEssentialData() {
    try {
      // 先加载用户信息（最重要）
      await this.loadUserInfo();
      
      // 然后加载模块列表（核心功能）
      this.loadModuleList();
      
      // 关键数据加载完成
      this.markPageReady();
      
    } catch (error) {
      console.error('工作台关键数据加载失败:', error);
      this.markPageError(error);
    }
  },

  // 加载次要数据
  loadSecondaryData() {
    // 延迟加载统计数据，不阻塞主要功能
    this.loadStatistics();
  },

  // 刷新数据
  refreshData() {
    const userInfo = wx.getStorageSync('userInfo');
    if (userInfo && userInfo.role) {
      this.setData({ userInfo });
      this.loadStatistics();
      this.loadModuleList();
    }
  },

  async checkLoginStatus() {
    // 检查登录状态
    if (!requireLogin()) {
      return;
    }
    
    // 已登录，加载页面数据
    await this.loadUserInfo();
    this.loadModuleList();
  },

  async loadUserInfo() {
    try {
      // 先从本地获取基础用户信息
      const localUserInfo = wx.getStorageSync('userInfo');
      if (localUserInfo) {
        this.setData({ userInfo: localUserInfo });
      }
      
      // 然后从服务器获取最新的用户信息
      const result = await fetchUserInfo();
      
      if (result.message == "操作成功") {
        this.setData({ userInfo: result.data });
      } else {
        // 如果获取失败但本地有信息，继续使用本地信息
        if (!localUserInfo) {
          wx.showToast({
            title: '获取用户信息失败',
            icon: 'none'
          });
        }
      }
    } catch (error) {
      // 如果出现异常且本地没有用户信息，跳转到登录页
      const localUserInfo = wx.getStorageSync('userInfo');
      if (!localUserInfo) {
        wx.redirectTo({
          url: '/pages/login/login'
        });
      }
    }
  },

  loadModuleList() {
    const { userInfo } = this.data;
    if (!userInfo) return;

    const userType = getUserType();
    const userPermissions = getUserPermissions();

    // 定义所有可能的功能模块
    const allModules = [
      { 
        id: MODULES.PIECEWORK_ENTRY,
        name: '计件录入', 
        icon: 'check-circle',
        path: '/pages/piecework-today/piecework-today',
        description: '查看今日录入记录'
      },
      { 
        id: MODULES.SALARY_QUERY,
        name: '查询工资', 
        icon: 'money',
        path: '/pages/salary-query/salary-query',
        description: '查询个人工资信息'
      },
      { 
        id: MODULES.LEADER_APPROVAL,
        name: '组长核对', 
        icon: 'edit',
        path: '/pages/leader-approval/leader-approval',
        description: '核对员工计件数据',
      },
      { 
        id: MODULES.INVENTORY_MANAGEMENT,
        name: '仓库管理', 
        icon: 'shop',
        path: '/pages/inventory-management/inventory-management',
        description: '管理仓库库存信息'
      }
    ];

    // 根据用户权限过滤模块
    const accessibleModules = allModules.filter(module => {
      const hasAccess = hasPermission(module.id);
      logPermission('模块访问', module.name, hasAccess);
      return hasAccess;
    });
    
    this.setData({ moduleList: accessibleModules });
  },

  // 获取待审批数量（组长专用）
  getPendingApprovalCount() {
    // 这里应该从API获取实际数据
    return Math.floor(Math.random() * 20) + 5;
  },

  // 获取库存警告数量（仓库管理员专用）
  getInventoryAlertCount() {
    // 这里应该从API获取实际数据
    return Math.floor(Math.random() * 10) + 2;
  },

  loadStatistics() {
    // 模拟加载统计数据
    // 实际项目中这里会调用API
    setTimeout(() => {
      this.setData({
        statistics: {
          todayPiecework: Math.floor(Math.random() * 200) + 150,
          pendingApproval: Math.floor(Math.random() * 20) + 5,
          monthSalary: Math.floor(Math.random() * 3000) + 7000,
          inventoryAlert: Math.floor(Math.random() * 10) + 2
        }
      });
    }, 500);
  },

  onModuleClick(e) {
    const { path, moduleid } = e.currentTarget.dataset;
    
    if (!path || !moduleid) {
      wx.showToast({
        title: '功能配置错误',
        icon: 'none'
      });
      return;
    }

    if (path === '#') {
      wx.showToast({
        title: '功能正在开发中',
        icon: 'none'
      });
      return;
    }

    // 找到对应的模块信息
    const currentModule = this.data.moduleList.find(module => module.id === moduleid);
    const moduleName = currentModule ? currentModule.name : moduleid;

    // 使用权限检查系统进行导航
    checkPermissionAndNavigate(moduleid, path, () => {
      // 如果是跳转到计件录入页面，添加来源参数
      const finalUrl = path.includes('piecework-today') 
        ? `${path}${path.includes('?') ? '&' : '?'}from=workbench`
        : path;
        
      wx.navigateTo({ 
        url: finalUrl,
        fail: (err) => {
          wx.showToast({
            title: '页面加载失败',
            icon: 'none'
          });
        }
      });
    });
    
    // 记录用户操作日志
    logPermission('页面访问', moduleName, hasPermission(moduleid));
  },



  formatTime(timestamp) {
    const date = new Date(timestamp);
    const now = new Date();
    const diff = now - date;
    
    if (diff < 60000) {
      return '刚刚';
    } else if (diff < 3600000) {
      return Math.floor(diff / 60000) + '分钟前';
    } else if (diff < 86400000) {
      return Math.floor(diff / 3600000) + '小时前';
    } else {
      return date.toLocaleDateString();
    }
  }
}); 